#if 0
#include <stdio.h>
unsigned long int crc32_table[256];
unsigned long int ulPolynomial = 0x04c11db7;
unsigned long int Reflect(unsigned long int ref, char ch)
{    
	unsigned long int value=0;
	int i=0;
     // 交换 bit0 和 bit7，bit1 和 bit6，类推
     for(i = 1; i < (ch + 1); i++)
     {   
	     if(ref & 1)
                value |= 1 << (ch - i);
                ref >>= 1;       
     }
     return value;
}
init_crc32_table()
{    
     unsigned long int crc=0,temp=0;
     int i=0,j=0;
     // 256 个值
     for(i = 0; i <= 0xFF; i++)
     {    temp=Reflect(i, 8);
          crc32_table[i]= temp<< 24;
          for (j = 0; j < 8; j++)
	  {
            unsigned long int t1,t2;
            unsigned long int flag=crc32_table[i]&0x80000000;
            t1=(crc32_table[i] << 1);
            if(flag==0)
               t2=0;
            else
               t2=ulPolynomial;
            crc32_table[i] =t1^t2 ;     
	  }
          crc=crc32_table[i];
          crc32_table[i] = Reflect(crc32_table[i], 32);
	  if(i%8==0)
	      printf("\n");
	  printf("0x%8x ",crc32_table[i]);
     }
     printf("\n");
}
unsigned long GenerateCRC32(char *DataBuf,unsigned long len)
{
     unsigned long oldcrc32=0;
     unsigned long crc32=0;
     unsigned long oldcrc=0;
     unsigned int charcnt=0;
     char c=0,t=0;
     oldcrc32 = 0x00000000; //初值为 0
     charcnt = 0;
     while (len--) {
                     t = (oldcrc32 >> 24) & 0xFF;    //要移出的字节的值
                     oldcrc = crc32_table[t];           //根据移出的字节的值查表
                     c = DataBuf[charcnt];             //新移进来的字节值
                     oldcrc32 = (oldcrc32 << 8) | c;   //将新移进来的字节值添在寄存器末字节中
                     oldcrc32 = oldcrc32 ^ oldcrc;       //将寄存器与查出的值进行 xor 运算
                     charcnt++;
     }
          crc32=oldcrc32;
	  printf("crc32 : 0x%x \n",crc32);
          return crc32;
}

//int main()
int download_crc32(char *databuf, unsigned long length)
{
    unsigned long crc32_val = 0x0;
//    char databuf[1000] = {0x12,0x98,0x45,0x78,0xba,0};
    init_crc32_table();
    crc32_val = GenerateCRC32(databuf,length);
    printf("CRC is 0x%x \n",crc32_val);
}
#endif

#if 1

/* Copyright (C) 2002 Red Hat, Inc.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, version 2.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software Foundation,
   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

//#include <stdint.h>
//#include "system.h"


/* Table computed with Mark Adler's makecrc.c utility.  */
static const unsigned int crc32_table[256] =
{
  0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
  0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
  0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
  0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
  0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
  0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
  0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
  0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
  0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
  0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
  0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
  0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
  0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
  0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
  0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
  0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
  0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
  0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
  0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
  0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
  0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
  0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
  0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
  0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
  0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
  0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
  0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
  0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
  0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
  0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
  0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
  0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
  0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
  0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
  0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
  0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
  0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
  0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
  0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
  0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
  0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
  0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
  0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
  0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
  0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
  0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
  0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
  0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
  0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
  0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
  0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
  0x2d02ef8d
};

unsigned int crc32 (unsigned int crc, char *buf, int len)
{
  char *end;

  crc = ~crc;
  for (end = buf + len; buf < end; ++buf)
    crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
  return ~crc;
}


//int main()
unsigned int download_crc32(char *databuf,int length)
{
    unsigned int crc32_val = 0x0;
//    char databuf[1000] = {0x12,0x98,0x45,0x78,0xba,0};
//    init_crc32_table();
    //crc32_val = GenerateCRC32(databuf,length);
    crc32_val = crc32(0,databuf,length);
    printf("CRC is 0x%x \n",crc32_val);
    return crc32_val;
}

#endif
